perm filename CARNES.FAI[AER,HPM]5 blob sn#166360 filedate 1975-07-01 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002		TITLE	CARNES
C00004 00003	AR2TAB:	MOVEI	T,44			TOTAL BITS/WORD
C00006 00004	CAR12:	D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D
C00035 00005		END
C00036 ENDMK
C⊗;
	TITLE	CARNES

;FOR RECOGNIZING CARS
	
	ENTRY	VCAR
	ENTRY	CAR12,CARW12,CARH12

	EXTERN	CORGET,CORREL,SQRS
	
	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BPTAB←←12
	LINTAB←←13

	T←1  ↔  TT←2  ↔  TTT←3  ↔  ARRY1←4  ↔  ARRY2←5  ↔  P←17
	A←6  ↔  B←7  ↔  C←10  ↔  D←11  ↔  E←13  ↔  F←14  ↔  G←15


RETAD:	0
TEMP:	BLOCK	25		;TEMPORARY STORAGE FOR STUFF
AR2TAB:	MOVEI	T,44			;TOTAL BITS/WORD
	IDIV	T,BYBI(ARRY2)		;BYTE SIZE
	MOVEM	T,WDBY(ARRY2)		;BYTES PER WORD
	SUBI	TT,44			;-NUMBER OF USED BITS/WORD
	MOVNM	TT,WDBI(ARRY2)		;SAVED
	ADD	T,LNBY(ARRY2)
	SUBI	T,1
	IDIV	T,WDBY(ARRY2)		;NUMBER OF WORDS/SCANLINE
	MOVEM	T,LNWD(ARRY2)
	MOVE	TT,T	 		;WORDS/LINE
	IMUL	TT,WDBY(ARRY2)		;BYTES/WORD
	MOVEM	TT,LNBYA(ARRY2)		;GIVES BYTES/LINE, INCLUDING NULLS
	IMUL	TT,PCLN(ARRY2)
	MOVEM	TT,PCBYA(ARRY2)		;TOTAL BYTES/PIC, INCL. NULLS
	IMUL	T,PCLN(ARRY2)		;LINES IN THE PICTURE
	MOVEM	T,PCWD(ARRY2)		;WORDS IN THE PICTURE
	MOVE	T,LNBY(ARRY2)
	IMUL	T,PCLN(ARRY2)
	MOVEM	T,PCBY(ARRY2)		;BYTES/PIC, NOT INCL. NULLS
	MOVEI	T,14(ARRY2)
	ADD	T,PCLN(ARRY2)
	MOVEM	T,BPTAB(ARRY2)		;ADDRESS OF BYTE POINTER TABLE
	ADD	T,LNBYA(ARRY2)		;ADDR OF FIRST WORD IN PICTURE
	MOVN	TT,PCLN(ARRY2)		;SET UP CNTR FOR LINE ADDRESSES
	HRL	TT,TT
	HRRI	TT,LINTAB(ARRY2)
LTLP:	MOVEM	T,(TT)			;MAKE LINE TABLE
	ADD	T,LNWD(ARRY2)
	AOBJN	TT,LTLP
	MOVN	TT,BPTAB(ARRY2)
	HRL	TT,LNBYA(ARRY2)		;SET UP CNTR FOR BYTE TABLE
	AOBJN	TT,			;DECR ADDRESS AND INCR COUNT BY 1
	MOVN	TT,TT
	MOVEI	T,4400
	ADD	T,BYBI(ARRY2)
	LSH	T,6
	HRLZ	T,T
BYLP:	MOVEM	T,(TT)			;MAKE BYTE POINTER TABLE
	IBP	T
	AOBJN	TT,BYLP
	POPJ	P,
CAR12:	D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ C ↔ C ↔ C ↔ C ↔ C ↔ A ↔ D
	D ↔ C ↔ C ↔ C ↔ B ↔ B ↔ B ↔ B ↔ B ↔ B ↔ D
	D ↔ C ↔ C ↔ C ↔ B ↔ B ↔ B ↔ B ↔ B ↔ B ↔ D
	D ↔ C ↔ C ↔ C ↔ B ↔ B ↔ B ↔ B ↔ B ↔ B ↔ D
	D ↔ C ↔ C ↔ C ↔ B ↔ B ↔ B ↔ B ↔ B ↔ B ↔ D
	D ↔ C ↔ C ↔ C ↔ B ↔ B ↔ B ↔ B ↔ B ↔ B ↔ D
	D ↔ C ↔ C ↔ C ↔ B ↔ B ↔ B ↔ B ↔ B ↔ B ↔ D
	D ↔ C ↔ C ↔ C ↔ C ↔ B ↔ B ↔ B ↔ B ↔ C ↔ D
	D ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ D
	D ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ D
	D ↔ C ↔ C ↔ A ↔ C ↔ C ↔ C ↔ C ↔ C ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ A ↔ D
	D ↔ C ↔ C ↔ C ↔ A ↔ A ↔ A ↔ A ↔ A ↔ C ↔ D
	D ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ D
	D ↔ D ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ C ↔ D ↔ D
	D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D ↔ D

NOA←←=79 ↔ NOB←←=40 ↔ NOC←←=95 ↔ NOD←←=72

CARHIG←←=26 ↔ CARWID←←=11

CARW12: CARWID
CARH12:	CARHIG

X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
CARM←←TEMP ↔ SHFT2←TEMP+1 ↔ AVCAR←←TEMP+2 ↔ AY2←←TEMP+3
BX1←←TEMP+4 ↔ BY1←←TEMP+5 ↔ BX2←←TEMP+6 ↔ BY2←←TEMP+7
SOUWIN←←TEMP+10 ↔ DESWIN←←TEMP+11 ↔ DEXSKP←←TEMP+12 ↔ DEYSKP←←TEMP+13
WSIZ1←←TEMP+14 ↔ DWSIZ←←TEMP+15 ↔ WSIZY1←←TEMP+16
SOUSIZ←←TEMP+20 ↔ WSIZ←←TEMP+21 ↔ DWSIZ←←TEMP+22 ↔ NEGXC←TEMP+23

VCAR:	POP	P,RETAD
	POP	P,CARM
	POP	P,BX2		;A CARRELATOR. FINDS THE BEST MATCH
	POP	P,BY2		;TO A CAR
	POP	P,BX1		;IN ARRY2(BX1:BY1,BX2:BY2)
	POP	P,BY1
	POP	P,ARRY2
	MOVE	X1,BX1
	MOVE	X2,BX2		;   VCAR(
	MOVE	Y1,BY1		;         PICT,BX1,BY1,BX2,BY2);
	MOVE	Y2,BY2

	MOVEI	T,5		;TABLE)
	SUB	T,BYBI(ARRY2)
	HRRZM	T,SHFT2

FIXB:	CAMLE	X1,X2		;FIRST FIX UP THE LIMITS SO
	EXCH	X1,X2		;X1≤X2, X1≥0 X2<WIDTH ETC.
	CAIGE	X1,0
	MOVEI	X1,0
	MOVE	T,LNBY(ARRY2)
	CAML	X2,T
	MOVEI	X2,-1(T)

	CAMLE	Y1,Y2		;SIMILAR FOR Y
	EXCH	Y1,Y2
	CAIGE	Y1,0
	MOVEI	Y1,0
	MOVE	T,PCLN(ARRY2)
	CAML	Y2,T
	MOVEI	Y2,-1(T)

	CAMG	X1,X2
	CAMLE	Y1,Y2
	JRST	FIXB

	MOVEM	X1,BX1
	MOVEM	X2,BX2
	MOVEM	Y1,BY1
	MOVEM	Y2,BY2

	MOVE	T,BX2		;QUIT IF DESTINATION WINDOW IS TOO SMALL
	SUB	T,BX1
	SUBI	T,CARWID
	JUMPLE	T,QUITR

	MOVE	T,BY2
	SUB	T,BY1
	SUBI	T,CARHIG
	JUMPLE	T,QUITR

THIS←←TT ↔ SIZ←←TTT

	MOVEI	X2,CARWID
	MOVEI	X1,=1
	MOVEI	Y2,CARHIG
	MOVEI	Y1,=1

	MOVEI	SIZ,1(X2)	;CALCULATE SIZE OF BUFFER AREA
	SUB	SIZ,X1		;FOR THE SOURCE WINDOW CODE
	MOVEM	SIZ,WSIZ1	;WILL BE X WINDOWSIZE-1
	MOVEM	SIZ,WSIZ	;IS X WINDOWSIZ
	MOVNM	SIZ,DEXSKP	;WILL BE DELTA XB - DELTA XA
	MOVEI	T,1(Y2)
	SUB	T,Y1
	MOVEM	T,WSIZY1	;WILL BE X WINDOWSIZE-1
	MOVNM	T,DEYSKP	;WIL BE DELTA YB - DELTA YA
	IMUL	SIZ,T
	MOVEM	SIZ,SOUSIZ	;SOURCE WINDOW SIZE (IN PIXELS)
	ASH	SIZ,1
	ADDI	SIZ,1
	PUSHJ	P,CORGET	;AND MAKE THAT BUFFER
	HALT
	MOVEM	THIS,SOUWIN

	SUBI	THIS,1
	MOVN	T,T
	HRLZ	T,T
	HRRI	T,LINTAB(ARRY1)	;Y COUNTER
	ADD	T,Y1

	MOVE	0,BX2		;FINISH UP MAKING DELTA XB -DELTA XA
	SUB	0,BX1
	ADDI	0,1
	MOVEM	0,DWSIZ
	ADDM	0,DEXSKP
	MOVE	0,BY2		;AND THE Y'S TOO
	SUB	0,BY1
	ADDI	0,1
	ADDM	0,DEYSKP
	SOS	WSIZ1		;NOT TO MENTION X WINDOWSIZ-1
	SOS	WSIZY1		;AND Y WINDOWSIZ-1

	MOVE	G,[MOVE TT,0(T)]
	MOVEI	B,0
			;DON'T FORGET! A,B,C,D ARE X1,X2,Y1,Y2 ALSO
					;SET UP INNER
ILYLP:	MOVE	TTT,WSIZ		;"LOOP" OF THE CORRELATION
ILXLP:	PUSH	THIS,G			;A SEQUENCE OF
	ADDI	G,1			; MOVE TT,POSB(T)
	MOVE	A,CAR12(B)
	ADDI	B,1
	LSH	A,27
	ADD	A,[ADD	0,SQRS(TT)]
	PUSH	THIS,A
	SOJG	TTT,ILXLP
	ADD	G,DEXSKP
	AOBJN	T,ILYLP

	PUSH	THIS,[JRST INRDON]	;AND THE FINAL INSTR.
	

	MOVE	X1,BX1			;MAKE THE DESTINATION
	MOVE	X2,BX2			;WINDOW BUFFER
	MOVE	Y1,BY1
	MOVE	Y2,BY2
	MOVEI	SIZ,1(X2)
	SUB	SIZ,X1
	MOVEM	SIZ,DWSIZ
	MOVEI	T,1(Y2)
	SUB	T,Y1
	IMUL	SIZ,T
	PUSHJ	P,CORGET
	HALT
	MOVEM	THIS,DESWIN

	SUBI	THIS,1
	MOVN	T,T			;Y COUNTER
	HRLZ	T,T
	HRRI	T,LINTAB(ARRY2)
	ADD	T,Y1

	MOVE	E,BPTAB(ARRY2)		;BYTE POINTER SKELETON
	ADDI	E,-1(X1)		;FOR DESTINATION
	MOVE	E,(E)

BUYLP:	MOVE	F,E			;UNPACKS THE DESTINATION
	ADD	F,(T)			;WINDOW, ONE WORD/SAMPLE
	MOVE	TTT,DWSIZ
BUXLP:	ILDB	0,F
	LSH	0,@SHFT2		;SHIFT TO 5 BITS
	PUSH	THIS,0
	SOJG	TTT,BUXLP
	AOBJN	T,BUYLP

	SETZM	AVCAR

	MOVN	B,DEXSKP		;NOW ACTUALLY CORRELATE
	SUBI	B,1
	MOVEM	B,NEGXC

	MOVE	E,CARM
	SUBI	E,1			;SET UP POINTER FOR RESULTS

	MOVE	TTT,DEYSKP		;NUMBER OF ROWS
	MOVE	T,DESWIN		;WHERE TO START
CRYLP:	HRL	T,NEGXC			;INIT X CNTR, BUT KEEP OLD POSN
CRXLP:	SETZB	A,B			;ACCUMULATE CURRENT SUM IN A
	SETZB	C,D
	JRST	@SOUWIN			;JUMP TO PREVIOUSLY CREATED CODE

INRDON:	MOVE	F,A
	ASH	F,-24			;CALCULATE SIGMA (A-ABAR)↑2
	MOVE	TT,F			;ABAR REMAINS IN TT
	IDIVI	F,NOA
	IMUL	TT,F
	TLZ	A,777774
	SUB	A,TT
	MOVE	TT,F

	MOVE	F,B
	ASH	F,-24			;CALCULATE SIGMA (B-BBAR)↑2
	IMUL	F,F
	IDIVI	F,NOB
	TLZ	B,777774
	SUB	B,F

	TLZ	C,777774		;CALCULATE SIGMA C↑2
	ASH	C,1

	ADD	B,A			;AND TOTAL MEASURE
	ADD	B,C

	MOVE	F,D			;BOUNDARY CALCULATION
	





	PUSH	E,B			;WHICH WE STORE

	ADDM	A,AVCAR

	AOBJN	T,CRXLP			;SHIFT IN X, AND TRY AGAIN
	ADD	T,WSIZ1			;ADD WHATS NEEDED TO GET TO NEXT
	SOJGE	TTT,CRYLP			;SCANLINE, AND TRY AGAIN

	MOVE	THIS,SOUWIN		;RETURN THE USED CORAGE
	PUSHJ	P,CORREL
	MOVE	THIS,DESWIN
	PUSHJ	P,CORREL

	MOVE	1,AVCAR			;GET READY TO RETURN VALUE OF MATCH
QUITR:	JRST	@RETAD			;AND RETURN
	END